package sun.cn.common.cacheDto.proxy;

import java.lang.reflect.Method;

import sun.cn.common.cacheDto.dao.BaseDao;
import sun.cn.common.utils.StringExtendUtils;

/**
 * 抽象代理
 * 
 * @author sunlingao
 * @title
 * @date 2017年7月6日
 * @version
 */
public abstract class ServiceProxy {
	
	private static final String DAO_IMPL = "DaoImpl";

	/**
	 * 设置代理功能名称
	 * 
	 * @author sunlingao
	 * @date 2017年7月6日
	 * @version
	 * @return
	 */
	public abstract String getProxyName();

	/**
	 * 主体执行方法
	 * 
	 * @author sunlingao
	 * @date 2017年7月6日
	 * @version
	 * @param args
	 *            方法入参
	 * @param method
	 *            执行方法
	 * @param proxyObj
	 *            代理类
	 * @return 方法返回值
	 */
	public abstract Object executor(Object[] args, Method method, Object proxyObj) throws Exception;

	/**
	 * 
	 * @author sunlingao
	 * @date 2017年7月6日
	 * @version
	 * @param args
	 *            方法入参
	 * @param method
	 *            执行方法
	 * @param proxyObj
	 *            代理类
	 * @return 方法返回值
	 */
	public Object proxy(Object[] args, Method method, Object proxyObj) throws Exception {
		/** 检查dao 是否 实现basedao */
		String name = StringExtendUtils.getClassName(proxyObj.getClass().getName());
		if (StringExtendUtils.isNotBlank(name) && name.endsWith(DAO_IMPL) && !checkDaoisFromBaseDao(proxyObj.getClass())) {
				throw new RuntimeException(proxyObj.getClass().getName() + "需继承baseDao接口");
		}
		return executor(args, method, proxyObj);
	}

	private boolean checkDaoisFromBaseDao(Class<?> intface){
		for (Class<?> cls : intface.getInterfaces()) {
			if (BaseDao.class.isAssignableFrom(cls))
				return true;
		}
		return false;
	}

}
